package dominio.neuronio;

import java.util.ArrayList;
import java.util.List;

import dominio.ativacao.FuncaoAtivacao;
import dominio.padrao.Padrao;

/**
 * @author Paulo Vitor
 * @author Roberto Su
 * 
 * @description
 *
 *
 */
public abstract class NeuronioAbstrato implements Neuronio{
	
	// atributos comuns a todos os tipos de neurônio
	protected List<Sinapse> sinapses;
	protected double entradaLiquida;
	protected FuncaoAtivacao funcaoAtivacao;
	protected double saida;
	
	/**
	 * 
	 */
	public NeuronioAbstrato(){
		// iniciaiza a lista de sinapses
		this.sinapses = new ArrayList<Sinapse>();
	}
	
	/**
	 * 
	 * @param funcaoAtivacao
	 */
	public NeuronioAbstrato( FuncaoAtivacao funcaoAtivacao ){
		//
		this();
		
		// popula o algoritmo de ativação
		this.funcaoAtivacao = funcaoAtivacao;
	}

	/**
	 * Método que varre as sinapses do neuronio 
	 * totalizando as entradas ponderadas dos mesmos.
	 * 
	 * @return
	 */	
	protected double totalizarEntradaLiquida() {
		double soma = new Double( 0.0 );
		//
		if ( this.sinapses != null && this.sinapses.size() > 0 ) {
			for( Sinapse sinapse : this.sinapses ) {
				soma += sinapse.getEntradaPonderada();
			}
		}
		return soma;
	}
	
	/* (non-Javadoc)
	 * @see dominio.neuronio.Neuronio#definirFuncaoAtivacao(dominio.ativacao.FuncaoAtivacao)
	 */
	public void definirFuncaoAtivacao( FuncaoAtivacao funcaoAtivacao ) {
		this.funcaoAtivacao = funcaoAtivacao;
	}
	
	/* (non-Javadoc)
	 * @see dominio.neuronio.Neuronio#criarSinapses(double[])
	 */
	public void criarSinapses(Padrao padrao) {
		this.sinapses.clear();
		
		if ( padrao.getQtdeEstimulos() > 0 ) {
			
			double[] estimulos = padrao.getEstimulos();
			
			for( int i = 0; i < estimulos.length; i++ ) {
				this.sinapses.add( new Sinapse( estimulos[i] ) );
			}
		}
	}
	
	/* (non-Javadoc)
	 * @see dominio.neuronio.Neuronio#criarSinapses(double[], double[])
	 */
	public void criarSinapses(Padrao padrao, double[] w) {
		this.sinapses.clear();
		
		if ( padrao.getQtdeEstimulos() > 0 ) {
			
			double[] estimulos = padrao.getEstimulos();
			
			for( int i = 0; i < estimulos.length; i++ ) {
				this.sinapses.add( new Sinapse( estimulos[i], w[i] ) );
			}
		}
	}
	
	/* (non-Javadoc)
	 * @see dominio.neuronio.Neuronio#getSinapses()
	 */
	public List<Sinapse> getSinapses() {
		return sinapses;
	}
	
}
